{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T01:29:10.708546Z",
     "start_time": "2021-02-22T01:29:10.705247Z"
    }
   },
   "outputs": [],
   "source": [
    "import os\n",
    "os.environ[\"KMP_DUPLICATE_LIB_OK\"]=\"TRUE\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T01:29:15.244850Z",
     "start_time": "2021-02-22T01:29:12.311239Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "from keras.datasets import imdb\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T01:29:27.785188Z",
     "start_time": "2021-02-22T01:29:16.115575Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Downloading data from https://s3.amazonaws.com/text-datasets/imdb.npz\n",
      "17465344/17464789 [==============================] - 5s 0us/step\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/rex/anaconda3/envs/py37/lib/python3.7/site-packages/keras/datasets/imdb.py:101: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray\n",
      "  x_train, y_train = np.array(xs[:idx]), np.array(labels[:idx])\n",
      "/Users/rex/anaconda3/envs/py37/lib/python3.7/site-packages/keras/datasets/imdb.py:102: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray\n",
      "  x_test, y_test = np.array(xs[idx:]), np.array(labels[idx:])\n"
     ]
    }
   ],
   "source": [
    "(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## IMDB数据集\n",
    "数据集被分为用于训练的 25 000 条评论与用于测试的 25 000 条评论，训练集和测试集都包含 50% 的正面评论和 50% 的负面评论。train_data 和 test_data 这两个变量都是评论组成的列表，每条评论又是单词索引组成的列表（表示一系列单词）。train_labels 和 test_labels 都是 0 和 1 组成的列表，其中 0代表负面（negative），1 代表正面（positive）。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T01:37:19.051665Z",
     "start_time": "2021-02-22T01:37:18.944412Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9999"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "max([max(seq) for seq in train_data])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T01:38:04.724001Z",
     "start_time": "2021-02-22T01:38:04.720184Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(25000,)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T01:38:27.033331Z",
     "start_time": "2021-02-22T01:38:24.632612Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Downloading data from https://s3.amazonaws.com/text-datasets/imdb_word_index.json\n",
      "1646592/1641221 [==============================] - 1s 1us/step\n"
     ]
    }
   ],
   "source": [
    "word_index = imdb.get_word_index()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T01:38:37.025686Z",
     "start_time": "2021-02-22T01:38:36.992985Z"
    }
   },
   "outputs": [],
   "source": [
    "reserve_word_index = dict([(v,k) for (k, v) in word_index.items()])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T01:39:46.188432Z",
     "start_time": "2021-02-22T01:39:46.184230Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"? i am a great fan of david lynch and have everything that he's made on dvd except for hotel room the 2 hour twin peaks movie so when i found out about this i immediately grabbed it and and what is this it's a bunch of ? drawn black and white cartoons that are loud and foul mouthed and unfunny maybe i don't know what's good but maybe this is just a bunch of crap that was ? on the public under the name of david lynch to make a few bucks too let me make it clear that i didn't care about the foul language part but had to keep ? the sound because my neighbors might have all in all this is a highly disappointing release and may well have just been left in the ? box set as a curiosity i highly recommend you don't spend your money on this 2 out of 10\""
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "' '.join([reserve_word_index.get(i-3, '?') for i in train_data[100]])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 准备数据\n",
    "1. 填充列表  第一层使用Embedding\n",
    "2. one-hot  第一层使用Dense"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T02:15:09.308530Z",
     "start_time": "2021-02-22T02:15:09.305589Z"
    }
   },
   "outputs": [],
   "source": [
    "def vectorize_sequences(sequences, dimension=10000):\n",
    "    results = np.zeros((len(sequences), dimension))\n",
    "    for i, sequence in enumerate(sequences):\n",
    "        results[i, sequence] = 1\n",
    "    return results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T02:15:10.630086Z",
     "start_time": "2021-02-22T02:15:09.489484Z"
    }
   },
   "outputs": [],
   "source": [
    "x_train = vectorize_sequences(train_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T02:15:10.635443Z",
     "start_time": "2021-02-22T02:15:10.631723Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10000"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(x_train[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T02:15:12.966636Z",
     "start_time": "2021-02-22T02:15:11.841746Z"
    }
   },
   "outputs": [],
   "source": [
    "x_test = vectorize_sequences(test_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T02:15:12.972162Z",
     "start_time": "2021-02-22T02:15:12.968359Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 1., 1., ..., 0., 0., 0.])"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_test[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T02:15:26.622991Z",
     "start_time": "2021-02-22T02:15:26.620414Z"
    }
   },
   "outputs": [],
   "source": [
    "y_train = train_labels.astype('float32')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T02:15:29.820099Z",
     "start_time": "2021-02-22T02:15:29.817608Z"
    }
   },
   "outputs": [],
   "source": [
    "y_test = test_labels.astype(np.float32)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T02:16:04.566686Z",
     "start_time": "2021-02-22T02:16:04.564596Z"
    }
   },
   "source": [
    "## 构建网络\n",
    "Dense层  一个隐藏单元（hidden unit）是该层表示空间的一个维度, “网络学习内部表示时所拥有的自由度”\n",
    "Dense层关键架构：\n",
    " 网络有多少层；\n",
    " 每层有多少个隐藏单元。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T02:44:12.764666Z",
     "start_time": "2021-02-22T02:44:12.761642Z"
    }
   },
   "outputs": [],
   "source": [
    "from keras import models\n",
    "from keras import layers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T03:04:44.571540Z",
     "start_time": "2021-02-22T03:04:44.498046Z"
    }
   },
   "outputs": [],
   "source": [
    "model = models.Sequential()\n",
    "model.add(layers.Dense(8, activation='relu', input_shape=(10000,)))\n",
    "model.add(layers.Dense(8, activation='relu'))\n",
    "model.add(layers.Dense(1, activation='sigmoid'))\n",
    "model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 验证方法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T03:04:44.938649Z",
     "start_time": "2021-02-22T03:04:44.936003Z"
    }
   },
   "outputs": [],
   "source": [
    "x_val = x_train[:10000]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T03:04:45.090230Z",
     "start_time": "2021-02-22T03:04:45.087711Z"
    }
   },
   "outputs": [],
   "source": [
    "partial_x_train = x_train[10000:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T03:04:45.234456Z",
     "start_time": "2021-02-22T03:04:45.231871Z"
    }
   },
   "outputs": [],
   "source": [
    "y_val = y_train[:10000]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T03:04:45.386250Z",
     "start_time": "2021-02-22T03:04:45.383968Z"
    }
   },
   "outputs": [],
   "source": [
    "partial_y_train = y_train[10000:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T03:05:09.620478Z",
     "start_time": "2021-02-22T03:04:45.543563Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 15000 samples, validate on 10000 samples\n",
      "Epoch 1/16\n",
      "15000/15000 [==============================] - 2s 152us/step - loss: 0.6088 - accuracy: 0.6727 - val_loss: 0.5547 - val_accuracy: 0.6948\n",
      "Epoch 2/16\n",
      "15000/15000 [==============================] - 2s 103us/step - loss: 0.5064 - accuracy: 0.8167 - val_loss: 0.5064 - val_accuracy: 0.7993\n",
      "Epoch 3/16\n",
      "15000/15000 [==============================] - 2s 102us/step - loss: 0.4574 - accuracy: 0.8753 - val_loss: 0.4967 - val_accuracy: 0.8117\n",
      "Epoch 4/16\n",
      "15000/15000 [==============================] - 2s 100us/step - loss: 0.4236 - accuracy: 0.9040 - val_loss: 0.4765 - val_accuracy: 0.8473\n",
      "Epoch 5/16\n",
      "15000/15000 [==============================] - 1s 95us/step - loss: 0.3970 - accuracy: 0.9253 - val_loss: 0.4938 - val_accuracy: 0.8318\n",
      "Epoch 6/16\n",
      "15000/15000 [==============================] - 2s 105us/step - loss: 0.3763 - accuracy: 0.9410 - val_loss: 0.4718 - val_accuracy: 0.8652\n",
      "Epoch 7/16\n",
      "15000/15000 [==============================] - 1s 97us/step - loss: 0.3573 - accuracy: 0.9541 - val_loss: 0.4816 - val_accuracy: 0.8599\n",
      "Epoch 8/16\n",
      "15000/15000 [==============================] - 1s 98us/step - loss: 0.3433 - accuracy: 0.9605 - val_loss: 0.4760 - val_accuracy: 0.8665\n",
      "Epoch 9/16\n",
      "15000/15000 [==============================] - 1s 92us/step - loss: 0.3288 - accuracy: 0.9676 - val_loss: 0.4974 - val_accuracy: 0.8617\n",
      "Epoch 10/16\n",
      "15000/15000 [==============================] - 1s 93us/step - loss: 0.3169 - accuracy: 0.9724 - val_loss: 0.4781 - val_accuracy: 0.8700\n",
      "Epoch 11/16\n",
      "15000/15000 [==============================] - 1s 91us/step - loss: 0.3050 - accuracy: 0.9786 - val_loss: 0.4977 - val_accuracy: 0.8685\n",
      "Epoch 12/16\n",
      "15000/15000 [==============================] - 1s 89us/step - loss: 0.2964 - accuracy: 0.9791 - val_loss: 0.5444 - val_accuracy: 0.8579\n",
      "Epoch 13/16\n",
      "15000/15000 [==============================] - 1s 90us/step - loss: 0.2861 - accuracy: 0.9825 - val_loss: 0.5241 - val_accuracy: 0.8638\n",
      "Epoch 14/16\n",
      "15000/15000 [==============================] - 1s 90us/step - loss: 0.2772 - accuracy: 0.9855 - val_loss: 0.6120 - val_accuracy: 0.8504\n",
      "Epoch 15/16\n",
      "15000/15000 [==============================] - 1s 92us/step - loss: 0.2689 - accuracy: 0.9864 - val_loss: 0.6128 - val_accuracy: 0.8547\n",
      "Epoch 16/16\n",
      "15000/15000 [==============================] - 1s 91us/step - loss: 0.2623 - accuracy: 0.9879 - val_loss: 0.6008 - val_accuracy: 0.8560\n"
     ]
    }
   ],
   "source": [
    "history = model.fit(partial_x_train, partial_y_train, batch_size=512, epochs=16, validation_data=(x_val, y_val))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T03:05:16.716772Z",
     "start_time": "2021-02-22T03:05:16.714231Z"
    }
   },
   "outputs": [],
   "source": [
    "history_dict = history.history"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T03:05:16.883729Z",
     "start_time": "2021-02-22T03:05:16.879466Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['val_loss', 'val_accuracy', 'loss', 'accuracy'])"
      ]
     },
     "execution_count": 144,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "history_dict.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T03:05:17.074817Z",
     "start_time": "2021-02-22T03:05:17.072281Z"
    }
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T03:05:17.274227Z",
     "start_time": "2021-02-22T03:05:17.271945Z"
    }
   },
   "outputs": [],
   "source": [
    "loss_values = history_dict['loss']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T03:05:17.458904Z",
     "start_time": "2021-02-22T03:05:17.456280Z"
    }
   },
   "outputs": [],
   "source": [
    "val_loss_values = history_dict['val_loss']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T03:05:17.987248Z",
     "start_time": "2021-02-22T03:05:17.983781Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "range(1, 17)"
      ]
     },
     "execution_count": 148,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "range(1, len(loss_values) + 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T03:05:18.354932Z",
     "start_time": "2021-02-22T03:05:18.352368Z"
    }
   },
   "outputs": [],
   "source": [
    "epochs = range(1, len(loss_values) + 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T03:05:19.402473Z",
     "start_time": "2021-02-22T03:05:19.232315Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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cnr06EGPHj3Yddddadeu3ZbHGzZsKPfYgoICLr744gqv0bt376oHGOOdd95hwIABSTmX1D3qOpudUlmC6AXMc/f57r4BmAAMit3B3Yt8ayt5M8ATPTYVkl3P2rJlSwoLCyksLGTUqFFceumlWx43bNiQ4uLiMo/Nzc3lzjvvrPAaH3zwQdWCE6mEVHSd1XxRmS+VCaId8GXM48XRtm2Y2SlmNgf4F6EUkfCx0fEjo+qpgmXLllUr4JqoZz377LO57LLLOProo7nqqqv4+OOP6d27Nz179qR3797MnTsX2PYX/fXXX8+IESPo168fe+yxxzaJo3nz5lv279evH0OGDKFr167k5eVRkntfeeUVunbtypFHHsnFF19cYUnh+++/Z/DgwXTv3p3DDz+cmTNnAvDuu+9uKQH17NmT1atXs3TpUvr27UuPHj044IADmDJlSvLeLMkYyZ5xVo3etUMqx0HEa3Hcrk+tuz8HPGdmfYGbgJ8memx0fD6QD6Gba5WjpebqWf/73//y5ptvkpOTw6pVq5g8eTL169fnzTff5Pe//z3PPPPMdsfMmTOHt99+m9WrV7PvvvtywQUXbDde4D//+Q+zZs1i9913p0+fPrz//vvk5uZy/vnnM3nyZLp06cKwYcMqjO+6666jZ8+ePP/887z11lucddZZFBYWcttttzF27Fj69OlDUVERjRs3Jj8/n+OPP57Ro0ezadMm1pTOsFJn5OUlr1treT/G1HU2c6QyQSwGOsQ8bg8sKWtnd59sZnuaWavKHpssHTuGXzLxtifTaaedRk5ODgArV65k+PDhfP7555gZGzdujHvMSSedRKNGjWjUqBFt2rThm2++oX379tvs06tXry3bevTowYIFC2jevDl77LHHlrEFw4YNIz8/v9z43nvvvS1J6phjjmH58uWsXLmSPn36cNlll5GXl8epp55K+/btOfTQQxkxYgQbN25k8ODB9OjRozpvjWQJNXrXDqmsYpoK7G1mXcysIXA68GLsDma2l0V9G83sYKAhsDyRY1OhpqYoaNas2Zb7f/jDHzj66KP59NNPeemll8ocB9CoUaMt93NycuK2X8TbpyoDIeMdY2ZcffXVPPDAA6xdu5bDDz+cOXPm0LdvXyZPnky7du0488wzefTRRyt9Pck+avSuHVKWINy9GLgImAjMBp5y91lmNsrMRkW7/Rz41MwKCb2WhnoQ99hUxVoiHSt7rVy5knbtQvPKww8/nPTzd+3alfnz57NgwQIAnnzyyQqP6du3L+OjyuB33nmHVq1ascMOO/C///2PAw88kKuuuorc3FzmzJnDwoULadOmDeeddx6//OUvmT59etJfg9Q9mi+qdkjpXEzu/grwSqlt98bc/zPw50SPrQnJrGdNxJVXXsnw4cP529/+xjHHHJP08zdp0oR77rmH/v3706pVK3r16lXhMddffz3nnHMO3bt3p2nTpjzyyCMA3HHHHbz99tvk5OTQrVs3TjjhBCZMmMCtt95KgwYNaN68uUoQkpBUzBelqUCSr87PxTR79mz222+/NEWUGYqKimjevDnuzoUXXsjee+/NpZdemu6w4tLnJVVRehU9CCUSre1dsayei0ng/vvvp0ePHuy///6sXLmS888/P90hiSSVpgJJjTo/3bfApZdemrElBpFkUK+o1FAJQkRqPfWKSg0lCBGp9VLVKyrbpwNRghCRWi8VXdQ1HYgShIjUEXl5sGABbN4c/la395IavpUgUq5fv35MnDhxm2133HEHv/rVr8o9pqS77oknnsiKFSu22+f666/ntttuK/fazz//PJ999tmWx9deey1vvvlmJaKPT1ODSzZQw7cSRMoNGzaMCRMmbLNtwoQJCU2aB2Em1p122qlK1y6dIG688UZ++tOfVulcItkmFQ3fta1NI6u6uf7mN1BYmNxz9ugBd9xR9vNDhgzhmmuuYf369TRq1IgFCxawZMkSjjzySC644AKmTp3K2rVrGTJkCDfccMN2x3fu3JmCggJatWrFmDFjePTRR+nQoQOtW7fmkEMOAcI4h/z8fDZs2MBee+3FY489RmFhIS+++CLvvvsuN998M8888ww33XQTAwYMYMiQIUyaNIkrrriC4uJiDj30UMaNG0ejRo3o3Lkzw4cP56WXXmLjxo3885//pGvXrmW+vu+//54RI0Ywf/58mjZtSn5+Pt27d+fdd9/lkksuAcI8TpMnT6aoqIihQ4eyatUqiouLGTduHEcddVR13n6RlBkzJv7gu6o2fJcezFfSpgGZO5hPJYgUa9myJb169eK1114DQulh6NChmBljxoyhoKCAmTNn8u67725ZdyGeadOmMWHCBP7zn//w7LPPMnXq1C3PnXrqqUydOpUZM2aw33778eCDD9K7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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(epochs, loss_values, 'bo',label='Training loss')\n",
    "plt.plot(epochs, val_loss_values, 'b', label='Validation loss')\n",
    "plt.title('Training and validation loss')\n",
    "plt.xlabel('Epochs')\n",
    "plt.ylabel('Loss')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T03:05:21.652000Z",
     "start_time": "2021-02-22T03:05:21.647580Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.clf()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T03:05:22.021886Z",
     "start_time": "2021-02-22T03:05:21.848225Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "acc = history_dict['accuracy']\n",
    "val_acc = history_dict['val_accuracy']\n",
    "plt.plot(epochs, acc, 'bo',label='Training acc')\n",
    "plt.plot(epochs, val_acc, 'b', label='Validation acc')\n",
    "plt.title('Training and validation accuracy')\n",
    "plt.xlabel('Epochs')\n",
    "plt.ylabel('Accuracy')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 评估模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T03:05:25.870158Z",
     "start_time": "2021-02-22T03:05:24.594808Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "25000/25000 [==============================] - 1s 51us/step\n"
     ]
    }
   ],
   "source": [
    "results = model.evaluate(x_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T03:05:26.403683Z",
     "start_time": "2021-02-22T03:05:26.399800Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.5943002486419677, 0.8518400192260742]"
      ]
     },
     "execution_count": 154,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 预测结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T03:05:30.069398Z",
     "start_time": "2021-02-22T03:05:29.050759Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.3787479 ],\n",
       "       [1.        ],\n",
       "       [0.99999976],\n",
       "       ...,\n",
       "       [0.3876667 ],\n",
       "       [0.3787479 ],\n",
       "       [0.97389257]], dtype=float32)"
      ]
     },
     "execution_count": 155,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.predict(x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-02-22T03:05:59.383892Z",
     "start_time": "2021-02-22T03:05:59.378540Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"? many animation buffs consider ? ? the great forgotten genius of one special branch of the art puppet animation which he invented almost single ? and as it happened almost accidentally as a young man ? was more interested in ? than the cinema but his ? attempt to film two ? ? fighting led to an unexpected breakthrough in film making when he realized he could ? movement by ? beetle ? and ? them one frame at a time this discovery led to the production of amazingly elaborate classic short the ? revenge which he made in russia in ? at a time when motion picture animation of all sorts was in its ? br br the political ? of the russian revolution caused ? to move to paris where one of his first productions ? was a dark political satire ? known as ? or the ? who wanted a king a strain of black comedy can be found in almost all of films but here it is very dark indeed aimed more at grown ups who can appreciate the satirical aspects than children who would most likely find the climax ? i'm middle aged and found it pretty ? myself and indeed ? of the film intended for english speaking viewers of the 1920s were given title cards filled with ? and ? in order to help ? the sharp ? of the finale br br our tale is set in a swamp the ? ? where the citizens are unhappy with their government and have called a special session to see what they can do to improve matters they decide to ? ? for a king the crowds are ? animated in this opening sequence it couldn't have been easy to make so many frog puppets look alive simultaneously while ? for his part is depicted as a ? white ? guy in the clouds who looks like he'd rather be taking a ? when ? sends them a tree like god who regards them the ? decide that this is no improvement and demand a different king irritated ? sends them a ? br br delighted with this ? looking new king who towers above them the ? welcome him with a ? of ? dressed ? the mayor steps forward to hand him the key to the ? as ? cameras record the event to everyone's horror the ? promptly eats the mayor and then goes on a merry rampage ? citizens at random a title card ? reads news of the king's ? throughout the kingdom when the now terrified ? once more ? ? for help he loses his temper and ? their community with lightning ? the moral of our story delivered by a hapless frog just before he is eaten is let well enough alone br br considering the time period when this startling little film was made and considering the fact that it was made by a russian ? at the height of that ? country's civil war it would be easy to see this as a ? about those events ? may or may not have had ? turmoil in mind when he made ? but whatever ? his choice of material the film stands as a ? tale of universal ? ? could be the soviet union italy germany or japan in the 1930s or any country of any era that lets its guard down and is overwhelmed by ? it's a fascinating film even a charming one in its macabre way but its message is no joke\""
      ]
     },
     "execution_count": 156,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "' '.join([reserve_word_index.get(i-3, '?') for i in test_data[2]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:py37] *",
   "language": "python",
   "name": "conda-env-py37-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.9"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": true
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
